import requests
import logging
from ConfigReader import get_auth_api_base_url
from RedisClient import RedisClient

logger = logging.getLogger(__name__)

# 全局变量用于保存 token 到内存缓存
AUTH_TOKEN = None
redis_client = RedisClient()

def fetch_and_cache_token():
    """
    获取 Token 并写入 Redis。
    如果失败，返回 False；成功则返回 True。
    """
    global AUTH_TOKEN

    # 从配置中获取 base URL 和路径
    base_url = get_auth_api_base_url()
    token_path = "/authority/token"
    url = f"{base_url.rstrip('/')}/{token_path.lstrip('/')}"

    payload = {
        "appid": "jiceng",
        "appsecret": "$2a$10$EB0O/MzBbpuW.PVCdTFgx.eoq9Y3tIzcjoGKXE/lS7.y90SZLiKxO"
    }

    try:
        logger.info(f"📡 正在请求 Token：{url}")
        response = requests.post(url, json=payload, timeout=10)

        if response.status_code != 200:
            logger.error(f"❌ 请求 Token 失败，状态码：{response.status_code}")
            return False

        data = response.json()

        # 检查接口返回是否为成功状态
        if data.get("code") != "00000":
            logger.error(f"❌ 接口返回错误码：{data.get('code')}, message: {data.get('message', '未知错误')}")
            return False

        # 提取 token 字段
        token = data.get("content", {}).get("token")
        if not token:
            logger.error("❌ 接口返回的 token 字段为空")
            return False

        AUTH_TOKEN = token
        redis_client.set_token(token=token, expire=3600 * 2)  # 设置 2 小时有效期
        logger.info("🔄 Token 更新成功")
        return True

    except requests.RequestException as e:
        logger.error(f"❌ 请求 Token 发生网络异常：{str(e)}", exc_info=True)
        return False
    except ValueError as e:
        logger.error(f"❌ 解析 Token 响应失败（JSON 格式错误）：{str(e)}", exc_info=True)
        return False
    except Exception as e:
        logger.error(f"❌ 获取 Token 出错：{str(e)}", exc_info=True)
        return False


def register_token_refresh_job(scheduler):
    """
    注册 Token 刷新任务到传入的调度器中
    """
    logger.info("⏰ 注册 Token 刷新任务：每 2 小时执行一次")

    scheduler.add_job(
        func=fetch_and_cache_token,
        trigger="interval",
        hours=2,
        id="refresh_auth_token_job",
        name="刷新认证 Token 任务",
        misfire_grace_time=60,
        coalesce=True,          # 合并漏掉的触发
        max_instances=1         # 防止并发执行多个实例
    )